LINQ к SQL - отображающееся исключение при использовании абстрактных базовых классов

См. std::lexicographical_compare :

// lexicographical_compare example
#include   // std::cout, std::boolalpha
#include   // std::lexicographical_compare
#include   // std::tolower

// a case-insensitive comparison function:
bool mycomp (char c1, char c2) {
    return std::tolower(c1)

Демо

21
задан Community 23 May 2017 в 12:25
поделиться

4 ответа

Я сталкивался с этой проблемой много раз в прошлом, потому что у нас аналогичная архитектура в фреймворк, который мы используем в нашей компании. Возможно, вы заметили, что если вы используете запросы LINQ в декларативном стиле, вы не столкнетесь с этой проблемой. Например, будет работать следующий код:

return (from i in db.GetTable<TUser>() where i.Name = "Something").FirstOrDefault();

Однако, поскольку мы используем выражения динамического фильтра, мы не можем использовать этот метод. Альтернативное решение - использовать что-то вроде этого:

return db.GetTable<TUser>().Select(i => i).Where(i => i.Name == "Something").SingleOrDefault();

Это решение решило нашу проблему, поскольку мы можем вставить ".Select (i => i)" в начало почти всех выражений. Это заставит движок Linq не смотреть на базовый класс для сопоставлений и заставит его смотреть на фактический класс сущности и находить сопоставления.

19
ответ дан 29 November 2019 в 21:24
поделиться

Вы задаете здесь несколько вопросов, Джаррод, вы можете быть более конкретными? То есть вы просто хотите знать, почему ваш метод не работает? Или, может быть, вам нужен способ использования объектов данных в разных проектах? Я предполагаю, что вы не пытаетесь использовать LINQ to SQL в качестве слоя сопоставления базы данных и что вы используете его в качестве модели предметной области? В каком случае оба приложения реализуют один и тот же домен (бизнес-процессы, проверка и т. Д.)?

0
ответ дан 29 November 2019 в 21:24
поделиться

Мне посчастливилось определять классы данных в общей сборке и использовать их во многих сборках вместо сопоставления классов данных многих сборок с общим контрактом. Используя ваши примерные пространства имен, поместите пользовательский DataContext и ваши общие классы данных в TestLinq2Sql.Shared:

namespace TestLinq2Sql.Shared
{
    public class SharedContext : DataContext
    {
        public Table<User> Users;
        public SharedContext (string connectionString) : base(connectionString) { }
    }

    [Table(Name = "Users")]
    public class User
    {
        [Column(DbType = "Int NOT NULL IDENTITY", IsPrimaryKey=true, CanBeNull = false)]
        public int Id { get; set; }

        [Column(DbType = "nvarchar(40)", CanBeNull = false)]
        public string Name { get; set; }

        [Column(DbType = "nvarchar(100)", CanBeNull = false)]
        public string Email { get; set; }
    }
}

Затем используйте DataContext из любой другой сборки:

using (TestLinq2Sql.Shared.SharedContext shared = 
    new TestLinq2Sql.Shared.SharedContext(
        ConfigurationManager.ConnectionStrings["myConnString"].ConnectionString))
{
    var user = shared.Users.FirstOrDefault(u => u.Name == "test");
}  
3
ответ дан 29 November 2019 в 21:24
поделиться

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

Взлом 1 = 1 будет означать, что он будет проходить через обычный круговой обход базы данных, но на самом деле ошибку следует зарегистрировать ...

3
ответ дан 29 November 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: