C# 动态linq是否适合此场景?

C# 动态linq是否适合此场景?,c#,linq,interface,dynamic-linq,C#,Linq,Interface,Dynamic Linq,我有一个简单的界面,IDevice public interface IDevice{ string Id{ get; } } 我有一个实现IDevice List<IDevice> devices; 我希望允许用户使用如下SQL查询在文本中设置条件: Id = 'Battery1' AND StateOfCharge > 95 var matches = devices.Where("Id = 'Battery1' AND StateOfCharge >

我有一个简单的界面,IDevice

public interface IDevice{
    string Id{ get; }
}
我有一个实现
IDevice

List<IDevice> devices;
我希望允许用户使用如下SQL查询在文本中设置条件:

Id = 'Battery1' AND StateOfCharge > 95
var matches = devices.Where("Id = 'Battery1' AND StateOfCharge > 95");
因此,我可以从文本配置文件中读取这些条件,并根据使用动态LINQ的设备列表进行评估,如下所示:

Id = 'Battery1' AND StateOfCharge > 95
var matches = devices.Where("Id = 'Battery1' AND StateOfCharge > 95");
这不起作用,因为(当然)当尝试从
GridDevice
获取
StateOfCharge
的值时,LINQ会失败

List<IDevice> devices;
我觉得自己有点像一个n00b,正在寻找一种实现我的目标的方法,如果有任何意见,我将不胜感激。

你可以写:

var matches = devices
              .OfType<BatteryDevice>()
              .Where(device => device.Id == "Battery1" && device.StateOfCharge > 95)
              .ToList();
var matches = (IEnumerable<IDevice>)devices...
或者你可以写:

var matches = devices
              .OfType<BatteryDevice>()
              .Where(device => device.Id == "Battery1" && device.StateOfCharge > 95)
              .ToList();
var matches = (IEnumerable<IDevice>)devices...
var matches=(IEnumerable)设备。。。
没有Linq

var matches = new List<IDevice>();
foreach ( var device in devices )
  if ( device is BatteryDevice )
  {
    var battery = (BatteryDevice)device;
    if ( battery.Id == "Battery1" && battery.StateOfCharge > 95 )
      matches.Add(battery);
  }
var matches=newlist();
foreach(设备中的var设备)
如果(设备为电池设备)
{
var电池=(电池设备)装置;
如果(电池Id==“电池1”和电池充电状态>95)
匹配。添加(电池);
}
您可以编写:

var matches = devices
              .OfType<BatteryDevice>()
              .Where(device => device.Id == "Battery1" && device.StateOfCharge > 95)
              .ToList();
var matches = (IEnumerable<IDevice>)devices...
或者你可以写:

var matches = devices
              .OfType<BatteryDevice>()
              .Where(device => device.Id == "Battery1" && device.StateOfCharge > 95)
              .ToList();
var matches = (IEnumerable<IDevice>)devices...
var matches=(IEnumerable)设备。。。
没有Linq

var matches = new List<IDevice>();
foreach ( var device in devices )
  if ( device is BatteryDevice )
  {
    var battery = (BatteryDevice)device;
    if ( battery.Id == "Battery1" && battery.StateOfCharge > 95 )
      matches.Add(battery);
  }
var matches=newlist();
foreach(设备中的var设备)
如果(设备为电池设备)
{
var电池=(电池设备)装置;
如果(电池Id==“电池1”和电池充电状态>95)
匹配。添加(电池);
}

我认为仍然可以使用动态Linq或Linq。先检查一下类型

这肯定不行。不是类型安全的

var filter1=devices.Where(q=>(q为GridDevice.Voltage==0);
这将是有效的,因为第一个过滤器是检查类型。您不会得到对象引用错误

var filtered=devices.Where(q=>q.GetType()==typeof(GridDevice)和&(q为GridDevice)。电压==0);

我认为仍然可以使用动态Linq或Linq。先检查一下类型

这肯定不行。不是类型安全的

var filter1=devices.Where(q=>(q为GridDevice.Voltage==0);
这将是有效的,因为第一个过滤器是检查类型。您不会得到对象引用错误

var filtered=devices.Where(q=>q.GetType()==typeof(GridDevice)和&(q为GridDevice)。电压==0);

用户是否将此“Id=”电池1“和充电状态>95”写入文本?或者您将从两个单独的输入中获取值?可能需要首先强制转换设备.OfType()。其中(…@AmrElgarhy我希望允许它们以单行文本的形式输入,其想法是通过评估SQL条件可以打开或关闭一组开关设备string@Jimbo使用设备(IDevice)to query不适用于两个继承的类,除非您在查询中插入了强制转换,如下面的Olivier Rogier答案。用户是否将此“Id=”Battery1“和StateOfCharge>95”写入文本?或者您将从两个单独的输入中获取值?可能需要先强制转换
devices.OfType()。在哪里(…
@AmrElgarhy我希望允许他们将其作为一行文本输入,其想法是通过评估SQL条件可以打开或关闭一组开关设备string@Jimbo使用设备(IDevice)除了在查询中插入强制转换(类似于Olivier Rogier在下面回答的内容)之外,to query不会对这两个继承的类都起作用。
。of type
:)让我想知道,如果我不是从错误的角度来解决问题的话?你的设计似乎是正确的,但没有多态性或继承性,你通过使用接口模拟并重复代码,那么什么问题的角度是错误的?谢谢。考虑到将有许多不同类型的IDevice实现,例如逆变器、充电器、,温度传感器、湿度传感器、天气传感器、时间传感器,我需要创建一个ForLoop,它枚举程序集中实现IDevice的所有类型,然后过滤设备列表并对每个类型运行查询。可能无法执行,这就是为什么我想知道是否有更好的方法执行此操作,因为我想阅读查询om文本配置文件。据我所知,我不认为。OfType很方便。如果课程使用循环并检查每个项目的类型,则可以强制转换并应用测试。答案已更新。
。OfType
:)让我想知道,如果我不是从错误的角度来解决问题的话?你的设计似乎是正确的,但没有多态性或继承性,你通过使用接口模拟并重复代码,那么什么问题的角度是错误的?谢谢。考虑到将有许多不同类型的IDevice实现,例如逆变器、充电器、,温度传感器、湿度传感器、天气传感器、时间传感器,我需要创建一个ForLoop,它枚举程序集中实现IDevice的所有类型,然后过滤设备列表并对每个类型运行查询。可能无法执行,这就是为什么我想知道是否有更好的方法执行此操作,因为我想阅读查询om文本配置文件。据我所知,我不认为。OfType很方便。如果课程使用循环并检查每个项目的类型,则可以强制转换并应用测试。答案更新。有兴趣知道是否可以用动态LINQ编写?即文本而不是表达式。有兴趣知道是否可以用动态LINQ编写?即文本而不是表达式表情。