Я пытался работать с методом Join и GroupJoin. Проблема кажется простой. Даны TableA
и TableB
в виде карт данных, таких что:
class MyDataContext : DataContext
{
public Table<tblA> TableA;
public Table<tblB> TableB;
}
... Я использую TableA
в качестве основной таблицы и хочу объединиться в одно поле, CustomerID
в TableB
для получения [TableB].[LastName]
.
Не должно быть трудностей, за исключением того, что у меня возникают трудности с получением результатов для правильной работы. В TableA есть записи, которые мне нужны, независимо от совпадающего CustomerID в TableB. Походит на левое соединение - поэтому, читая здесь , я подражал тому, что предложил @tvanfosson:
// appropriately rewritten for my needs - so I thought...
private static IQueryable GetRecordsByView1(IQueryable<tblA> source)
{
var records = source.GroupJoin(myContext.TableB,
info => info.CustomerID,
owner => owner.CustomerID,
(info, owner) => new
{
info.CustomerID,
Owner = owner.Select(o => o.LastName).DefaultIfEmpty(),
Store = info.Store,
})
.Select(record => new
{
record.CustomerID,
record.Owner,
record.Store,
});
return records;
}
source
является динамическим, так что один метод создает динамический запрос:
public static void QueryStores()
{
IQueryable<tblA> source = myContext.TableA;
if (criteriaA)
source = source.Where(// something);
if (criteriaB)
source = source.Where(// something);
// after processing criteria logic, determine type of view
switch (byView)
{
case View1:
{
source = GetRecordsByView1(source);
break;
}
//other case blocks
}
myGridView.DataSource = source;
}
Проблема: я получаю следующую ошибку:
Не удалось отформатировать узел 'OptionalValue'
для выполнения в виде SQL.
Я полагаю, что это в следующей строке кода:
Owner = owner.Select(o => o.LastName).DefaultIfEmpty()
Что я здесь не так делаю? Я должен написать GroupJoin
в качестве метода расширения.