【问题标题】:c# LINQ to SQL dynamic where clausec# LINQ to SQL 动态 where 子句
【发布时间】:2016-06-21 02:40:35
【问题描述】:

我正在尝试进行动态查询以从 sql 数据库中提取数据。但是如何为列表框中的每个项目完成动态 where 子句?

例如:

where datumStart <= fout.Datum && datumEnd >= fout.Datum && foreach (var item in listbox.SelectedItems)
{
    Treinen treinData = (Treinen)item;
    where fout.Treinen.Name == treinData.Name
}

因此它将 foreach 中的所有项目添加为 && where 子句。

感谢所有帮助!

源代码:

            foreach (var items in _listBox.SelectedItems)
            {
                Treinen treinData = (Treinen)items;
                Console.WriteLine(treinData.Name);
            }
            DateTime datumStart = datePickerStart.SelectedDate.Value;
            DateTime datumEnd = datePickerEnd.SelectedDate.Value;

            ObjectQuery<Fouten> fouten = eventsEntities.Foutens;
            loadedData =
            (from fout in fouten
             where datumStart <= fout.Datum && datumEnd >= fout.Datum
             .....
             orderby fout.Datum, fout.Time

             select new
             {
                 Datum = fout.Datum,
                 Time = fout.Time,
                 FoutCode = fout.FoutCode,
                 Omschrijving = fout.Omschrijving,
                 Teller = fout.Teller,
                 Module = fout.Module.ToUpper(),
                 FoutId = fout.FoutId,
                 TreinId = fout.TreinId

             }).AsEnumerable().Select(x => new Fouten
             {
                 Datum = x.Datum,
                 Time = x.Time,
                 FoutCode = x.FoutCode,
                 Omschrijving = x.Omschrijving,
                 Teller = x.Teller,
                 Module = x.Module,
                 FoutId = x.FoutId,
                 TreinId = x.TreinId
             }).ToList();
            foutensDataGrid.ItemsSource = loadedData;

【问题讨论】:

  • 如果 where 子句中的属性发生变化,您需要使用表达式树,否则如果您只是更改 where 子句中的值,例如 x.Name = "Bob,则可以使用表达式" 或 x.Name = "Goostrabha" 并将表达式作为谓词传递给 where。
  • 您还可以在查询中添加多个 'where' 子句,每个 where 子句表示 '&&' 。例如,'var query= select x where cluase1 where Clause2'
  • 这个动态 where 子句究竟应该评估什么?

标签: c# sql wpf linq dynamic


【解决方案1】:

您可以将调用链接到 .Where() 扩展方法(以及许多其他 LINQ 扩展方法)。所以首先从你的收藏开始(以及你最初的.Where() 子句):

var foutens = eventsEntities.Foutens
              .Where(f => datumStart <= f.Datum && datumEnd >= f.Datum);

然后根据需要添加.Where()子句:

foreach (var item in listbox.SelectedItems)
{
    Treinen treinData = (Treinen)item;
    foutens = foutens.Where(f => f.Treinen.Name == treinData.Name);
}

然后您可以继续添加剩余的子句,这些子句都不会实际评估基础数据,直到您得到实际枚举它的内容(例如您的案例中的 .ToList()):

loadedData = foutens.Select(f => new
{
    Datum = f.Datum,
    Time = f.Time,
    FoutCode = f.FoutCode,
    Omschrijving = f.Omschrijving,
    Teller = f.Teller,
    Module = f.Module.ToUpper(),
    FoutId = f.FoutId,
    TreinId = f.TreinId
}).AsEnumerable().Select(x => new Fouten
{
    Datum = x.Datum,
    Time = x.Time,
    FoutCode = x.FoutCode,
    Omschrijving = x.Omschrijving,
    Teller = x.Teller,
    Module = x.Module,
    FoutId = x.FoutId,
    TreinId = x.TreinId
}).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 2013-11-25
    • 2023-03-29
    • 2012-02-25
    • 1970-01-01
    相关资源
    最近更新 更多