如何为linq语句开发一般方法?

时间:2015-05-09 07:55:18

标签: c# linq visual-studio-2013

我需要在visual studio中创建一个通用例程来获取一些参数作为输入并返回一个由存储库生成的列表。我正在使用Linq。但我不知道如何开发这个功能,也不知道我可以使用哪些关键词并找到一些资源。

这是我的程序中已经使用的示例代码:

var lstReceiptDetails = Repository<TransactionDetail>()
    .Where(current => current.HeaderId == headerId)
    .OrderBy(current => current.DocumentRow)
    .ToList();

我需要将上面的linq语句更改为类似下面的伪代码:

private List<> GetQuery(repositoryName,  conditionFieldName, orderFieldName )
{
var lstResult = Repository<repositiryName>()
    .Where(current => current.ConditionFieldName == conditionFieldName)
    .OrderBy(current => current.orderFieldName)
    .ToList();

Return(lstResult);
}

任何帮助都表示赞赏。 玛丽亚姆

2 个答案:

答案 0 :(得分:0)

我认为最接近的方法是使用下面的示例。我已经尝试了几种方法来做到这一点,但这会损害可用性和可读性。这是代码重复和可读性之间的折衷。

示例POCO对象:

class TransactionDetail
{
    public DateTime DateProcessed { get; set; }
    public string AccountName { get; set; }
}

存储库:

abstract class GenericRepository<T>
{
    public List<T> GetQuery<TKey>(
        Func<T, bool> conditionFieldName, 
        Func<T, TKey> orderFieldName)
    {
        var lstResult = Repository()
            .Where(conditionFieldName)
            .OrderBy(orderFieldName)
            .ToList();

        return lstResult;
    }

    private IEnumerable<T> Repository()
    {
        throw new NotImplementedException();
    }
}

class TransactionDetailRepository : GenericRepository<TransactionDetail>
{
}

来电者:

var repository = new TransactionDetailRepository();

var transactions = repository.GetQuery(
    x => x.AccountName == "Foo Bar",
    x => x.DateProcessed);

但仍应正确实施参数检查。

如果要在EntityFramework或Linq-to-SQL中使用这段代码,参数应该包含在Expression<T>中,例如:Func<T, bool>变为Expression<Func<T, bool>> }

答案 1 :(得分:0)

您可以尝试使用带有字符串参数而不是类型安全语言运算符的LINQ Dynamic Query Library。

简短的例子:

<h3>Category</h3>
<div class="leftBoxBody">
     <ul class="cat-link">
         @foreach($categories as $category)
            <li>{{Html::link('category/'.$category->id, $category->name)}}</li>
         @endforeach
     </ul>
</div>

此处提供更多信息:http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library