Subsonic 亚音速如何在泛型方法中提供列名

Subsonic 亚音速如何在泛型方法中提供列名,subsonic,subsonic3,Subsonic,Subsonic3,使用亚音速3,我有一个通用方法(感谢linq guy,James Curran): public List GetFromList(List\u id, Func GetID, Func GetAll) 其中T:class,IActiveRecord { 列表rc=null; var结果= 来自GetAll()中的项 其中(_idas IEnumerable).Contains(GetID(item)) 选择项目; rc=Results.ToList(); 返回rc; } 它被叫做 List&

使用亚音速3,我有一个通用方法(感谢linq guy,James Curran):

public List GetFromList(List\u id,
Func GetID,
Func GetAll)
其中T:class,IActiveRecord
{
列表rc=null;
var结果=
来自GetAll()中的项
其中(_idas IEnumerable).Contains(GetID(item))
选择项目;
rc=Results.ToList();
返回rc;
}
它被叫做

List<Job> jresults = GetFromList( IDList,
    item => item.JobID,
    ( ) => Job.All( ) );
List jresults=GetFromList(IDList,
item=>item.JobID,
()=>Job.All());
其中IDList是作为表键的guid的列表

如果不是通用的,linq看起来像这样,并且工作得非常完美。我印象深刻的是,亚音速的linq提供商可以将此代码转换为SELECT*,从JobID所在的作业(a、b、c):

var结果=
来自作业中的项。全部()
其中(_idas IEnumerable).Contains(item.JobID)
选择项目;
我希望能够在Job以外的表上调用此方法,使用JobID以外的键。GetAll Func之所以能够工作,是因为它返回的IQueryable与Job.All()返回的IQueryable相同,但GetID会引发运行时异常,“不支持Invoke类型的LINQ表达式节点”。GetID返回一个值,但我真正需要的是它包含的内容(item.JobID)可以识别为列名,“where”语法可以接受。(我没有在这里显示,但我对orderby也有同样的问题。)


这是否可能,根据您对亚音速3的了解?

我的解决方案是在需要时传递表达式:

 public List<T> GetFromList( List<Guid> _IDs,
    Func<IQueryable<T>> GetAll,
    Expression<Func<T, bool>> _where )
        where T : class, U, IActiveRecord
{
    List<T> rc = new List<T>( );
    if ( 0 < _IDs.Count )
    {
        if ( MAX_ITEMS > _IDs.Count )
        {
            var Results = GetAll( ).Where( _where );
            rc = Results.ToList( );
        }
        else
        {
            var Results =
                from id in _IDs
                join item in GetAll( ) on id equals item.KeyValue( )
                select item;
            rc = Results.ToList( );
        }
    }
    return rc;
}
public List GetFromList(List\u id,
Func GetAll,
表达式(在哪里)
其中T:class,U,IActiveRecord
{
List rc=新列表();
如果(0<_id.Count)
{
如果(最大项目数>\u id.Count)
{
var Results=GetAll().Where(_Where);
rc=Results.ToList();
}
其他的
{
var结果=
从id到\u id
id为equals item.KeyValue()的GetAll()中的联接项
选择项目;
rc=Results.ToList();
}
}
返回rc;
}
叫来

  rc = GetFromList(
      IDList,
      ( ) => Job.All( ),
      ( item => ( IDList as IEnumerable<Guid> ).Contains( item.JobID ) ) );
rc=GetFromList(
懒汉,
()=>Job.All(),
(item=>(IDList作为IEnumerable.Contains(item.JobID));

我已经读了好几遍了,我不得不说我不确定你想要达到什么样的最终结果。您将显示两个似乎实现相同结果的代码段—一个仅使用LINQ和ActiveRecord类,另一个使用您的泛型方法。也许您可以添加一段代码,说明您试图最终使用的代码不起作用?我想您正在尝试在更大的LINQ查询中使用您的泛型方法,但我还是不确定。谢谢您的关注。我试图实现的是,当T为Job时,Contains的参数为“item.JobID”,而当T为whates时,Contains的参数为“item.WhateverID”。我有很多表,每个表都有独特的搜索逻辑;搜索逻辑构建guid列表。一旦我有了它,每个表都会有相同的逻辑,使用WHERE“key”IN(Guid1,Guid2,…)来选择对象。我说,除了表和键列之外,都是一样的。GetAll解决了表的问题,但GetID没有解决列的问题。这更清楚了吗?我可能有隧道式的想法:我真正想要的最终结果是SQL查询SELECT*FROM Job,其中JobID位于(a、b、c)中,我的通用方法可以用于(1)任何表(除Job外),(2)任何键(除JobID外),以及(3)任何键值列表。我有(1)和(3),但没有(2)。
 public List<T> GetFromList( List<Guid> _IDs,
    Func<IQueryable<T>> GetAll,
    Expression<Func<T, bool>> _where )
        where T : class, U, IActiveRecord
{
    List<T> rc = new List<T>( );
    if ( 0 < _IDs.Count )
    {
        if ( MAX_ITEMS > _IDs.Count )
        {
            var Results = GetAll( ).Where( _where );
            rc = Results.ToList( );
        }
        else
        {
            var Results =
                from id in _IDs
                join item in GetAll( ) on id equals item.KeyValue( )
                select item;
            rc = Results.ToList( );
        }
    }
    return rc;
}
  rc = GetFromList(
      IDList,
      ( ) => Job.All( ),
      ( item => ( IDList as IEnumerable<Guid> ).Contains( item.JobID ) ) );