Finding Records

Simple Find

Set properties on a model instance to define search criteria:

var query = new Invoice { Status = "Open" };
var results = await client.FindAsync(query);

Pagination

Use skip and take parameters to paginate results:

var results = await client.FindAsync(query, skip: 0, take: 50);

Record ID Mapping

Pass Func delegates to map FileMaker’s internal record ID and modification ID onto your model:

Func<Invoice, int, object> fmIdFunc = (o, id) => o.FileMakerRecordId = id;
Func<Invoice, int, object> fmModIdFunc = (o, id) => o.FileMakerModId = id;

var results = await client.FindAsync(query, skip: 0, take: 50,
    script: null, scriptParameter: null,
    fmIdFunc: fmIdFunc, fmModIdFunc: fmModIdFunc);

Layout Override

By default, FMData uses the layout from [DataContract(Name = "...")]. To query a different layout:

var results = await client.FindAsync("AlternateLayout", query);

Find with Scripts

Run a FileMaker script as part of a find request:

var results = await client.FindAsync(query, skip: 0, take: 100,
    script: "AuditLog", scriptParameter: "find",
    fmIdFunc: fmIdFunc);

Get a Single Record by ID

Retrieve a single record using its FileMaker record ID:

var record = await client.GetByFileMakerIdAsync<Invoice>(42, fmIdFunc, fmModIdFunc);

You can also specify a layout override:

var record = await client.GetByFileMakerIdAsync<Invoice>("Invoices", 42, fmIdFunc);

Advanced: SendAsync with IFindRequest

For full control, build an IFindRequest directly:

var req = client.GenerateFindRequest<Invoice>();
req.Layout = "Invoices";
req.AddQuery(new Invoice { Status = "Open" }, omit: false);

var results = await client.SendAsync(req);

Omit Queries

Add queries with omit: true to exclude matching records:

req.AddQuery(new Invoice { Status = "Open" }, omit: false);
req.AddQuery(new Invoice { Status = "Cancelled" }, omit: true);

Sorting

Add sort fields with direction ("ascend" or "descend"):

req.AddSort("InvoiceDate", "descend");
req.AddSort("InvoiceNumber", "ascend");

Advanced: SendAsync with DataInfo and Script Results

Use the includeDataInfo overload to get record count metadata and script results alongside your data:

var req = client.GenerateFindRequest<Invoice>();
req.Layout = "Invoices";
req.AddQuery(new Invoice { Status = "Open" }, omit: false);

var (data, dataInfo, scriptResponse) = await client.SendAsync(req, includeDataInfo: true);

// dataInfo.FoundCount, dataInfo.TotalRecordCount, dataInfo.ReturnedCount
// scriptResponse?.ScriptResult, scriptResponse?.ScriptError

Advanced: SendFindRequestAsync

Use SendFindRequestAsync when the request model differs from the response model:

var req = client.GenerateFindRequest<InvoiceQuery>();
req.Layout = "Invoices";
req.AddQuery(new InvoiceQuery { Status = "Open" }, omit: false);

Func<InvoiceDetail, int, object> fmIdFunc = (o, id) => o.RecordId = id;
Func<InvoiceDetail, int, object> fmModIdFunc = (o, id) => o.ModId = id;

var (data, dataInfo, scriptResponse) = await client.SendFindRequestAsync<InvoiceDetail, InvoiceQuery>(
    req, fmIdFunc, fmModIdFunc);

This site uses Just the Docs, a documentation theme for Jekyll.