Нужна помощь в построении выражения LINQ to SQL - PullRequest
1 голос
/ 16 ноября 2009

Мне нужно перевести следующий код в выражение, и я объясню, почему:

results = results.Where(answer => answer.Question.Wording.Contains(term));

Результаты IQueryable
Вопрос в ISurveyQuestion
Формулировка строковая

Проблема в том, что вопрос не всегда является именем свойства LINQ to SQL.

Это даст мне PropertyInfo для фактического свойства ISurveyQuestion

private static PropertyInfo FindNaturalProperty<TMemberType>(Type search)
{
    IDictionary<string,PropertyInfo> properties = new Dictionary<string,PropertyInfo>();

    search.GetProperties().Each(prop =>
    {
        if (null != prop.PropertyType.GetInterface(typeof(TMemberType).Name))
            properties.Add(prop.Name, prop);
    });

    if (properties.Count < 1) throw new ArgumentException(String.Format("{0} has no properties of type {1}", search.Name, typeof(TMemberType).Name));
    if (properties.Count == 1) return properties.Values.First();

    search.GetInterfaces().Each(inter =>
    {
        inter.GetProperties().Each(prop =>
        {
            if (null != prop.PropertyType.GetInterface(typeof(TMemberType).Name))
                properties.Remove(prop.Name);
        });
    });

    if (properties.Count < 1) throw new ArgumentException(String.Format("{0} has no properties of type {1} that are not members of an interface", search.Name, typeof(TMemberType).Name));
    if (properties.Count > 1) throw new AmbiguousMatchException(String.Format("{0} has more than one property that are of type {1} and are not members of an interface", search.Name, typeof(TMemberType).Name));


    return properties.Values.First();
}

Как только я получу PropertyInfo, как мне перевести это в дерево выражений?

EDIT:

Что мне в основном нужно:

results = results.Where(answer => answer.GetQuestionProperty().GetValue(answer).Wording.Contains(term));

Но это не сработает, поэтому мне нужно самому построить дерево выражений для linq-to-sql.

Ответы [ 3 ]

1 голос
/ 16 ноября 2009

Читая вопрос, я думаю, вам нужен Dynamic Linq - вспомогательная библиотека, позволяющая динамически (!) Создавать запросы Linq с использованием строк, а не во время разработки. Это означает, что если вы сможете получить имя вашей собственности, вы сможете создать свой запрос на лету.

У ScottGu есть статья здесь

1 голос
/ 16 ноября 2009

То, что вы пытаетесь сделать, - это создать динамический запрос, и вы хотите, чтобы таблицы / свойства действий, с которыми ваш запрос также был динамическим. Я не уверен, что это легко возможно, исходя из того, как вы хотите его использовать.

Проверьте сообщение в блоге ScottGu: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

и

Ознакомьтесь с постом Рика Строля в блоге: http://www.west -wind.com / Weblog / сообщений / 143814.aspx

0 голосов
/ 16 ноября 2009

http://www.linqpad.net/

linqpad преобразует его для вас.

...